/**
 * AxiosHelper
 *
 * 目标：
 * - 提供“读(Read)”与“写(Write)”两类 axios 实例，各自支持最多 5 个端口配置
 * - 保持向后兼容：依然可通过 `Read` / `Write` 使用第 1 个实例
 * - 提供按索引获取指定端口实例的工具函数，便于在页面中灵活选择
 * - 统一注册拦截器：自动携带 Token，401 统一提示并跳转登录
 */
import axios from "axios";
import { ElMessage } from 'element-plus'
import {useCounterStore} from '@/stores/counter'

// 可配置的基础地址（根据MCP配置映射的端口）
// 端口映射：
// 索引0 (5028/5095) - 主API服务器：Organize、User、Post、Role管理
// 索引1 (5139/5281) - Team管理服务器：Team、Calendar、Schedule管理
// 索引2 (5222/5097) - 扩展API服务器：待分配
// 索引3 (5260/5011) - 报表管理服务器：ReportSummary相关
// 索引4 (5267/5062) - 销售管理服务器：SalesManagement相关
// 根据环境动态设置API基础URL
// 开发环境使用Kong网关，生产环境直接访问后端
const getApiBaseUrl = () => {
  // 如果是开发环境，使用代理
  if (import.meta.env.DEV) {
    return '/api'
  }
  // 生产环境直接访问后端服务器
  return 'http://115.190.167.248:8000'
}

const API_BASE_URL = getApiBaseUrl()

const READ_BASE_URLS:string[]=[
  'http://115.190.167.248:8000',
  'http://115.190.167.248:8000',
  'http://115.190.167.248:8000',
  'http://115.190.167.248:8000',
  'http://115.190.167.248:8000'
]

const WRITE_BASE_URLS:string[]=[
  'http://115.190.167.248:8000',
  'http://115.190.167.248:8000',
  'http://115.190.167.248:8000',
  'http://115.190.167.248:8000',
  'http://115.190.167.248:8000'
]

/**
 * 为 axios 实例挂载统一的请求/响应拦截器
 * - 请求：自动从 Pinia 的 `useCounterStore` 中读取 `User.Token` 并设置 Authorization
 * - 响应：捕获 401，提示并跳转到登录页
 */
function attachInterceptors(instance:any){
  // 请求拦截器
  instance.interceptors.request.use(
    (config:any)=>{
      const store=useCounterStore();
      if(!config.headers){
        config.headers={}
      }
      config.headers.Authorization=  "Bearer " + (store?.User?.Token||'');
      return config
    },
    (error:any)=>{
      return Promise.reject(error);
    }
  );

  // 响应拦截器
  instance.interceptors.response.use(
    (res:any)=>{
      return res
    },
    (error:any)=>{
      const status= error?.response?.status ?? error?.status
      if(status==401){
        ElMessage.error('您未授权,请联系管理员')
        location.href='/'
      }
      return Promise.reject(error);
    }
  );
}

/**
 * 根据一组 baseURL 创建对应的 axios 客户端数组，并挂载拦截器
 * @param baseUrls 例如 READ_BASE_URLS / WRITE_BASE_URLS
 */
function createClients(baseUrls:string[]){
  const clients= baseUrls.map(url=> axios.create({ baseURL:url, timeout:120000 }))
  clients.forEach(c=>attachInterceptors(c))
  return clients
}

// 创建 5 个 Read/Write 实例
// ReadClients/WriteClients 均是长度为 5 的数组
const ReadClients = createClients(READ_BASE_URLS)
const WriteClients = createClients(WRITE_BASE_URLS)

// 兼容原有导出：默认使用第一个实例
// 例如：Read => http://localhost:5028, Write => http://localhost:5095
const Read = ReadClients[0]
const Write = WriteClients[0]

// 工具方法：按索引获取对应实例（0-4），越界将回退到下标 0
function getReadClient(index:number){
  return ReadClients[index] || ReadClients[0]
}

function getWriteClient(index:number){
  return WriteClients[index] || WriteClients[0]
}

// 导出：
// - Read / Write：默认实例（保持历史用法）
// - ReadClients / WriteClients：实例数组（直接按下标取）
// - getReadClient / getWriteClient：工具函数（更安全的取法）
export { Read, Write, ReadClients, WriteClients, getReadClient, getWriteClient }